#ifndef PMM_H
#define PMM_H

#include <stdint.h>
#include <stddef.h>

// 页大小定义（4KB），与实现保持一致
#define PAGE_SIZE 4096
#define PAGE_SHIFT 12  // 用于页地址计算（2^12 = 4096）

/**
 * 初始化物理内存管理器
 * 功能：自动从内核结束地址（_end）开始初始化内存范围，
 *       建立页位图并标记可用内存
 */
void pmm_init(uint64_t start, uint64_t end);  // 替换原无参声明
/**
 * 分配一个物理页（4KB）
 * 返回：页对齐的物理地址（成功）或 NULL（失败）
 */
void* alloc_page(void);

/**
 * 释放一个物理页
 * 参数：page - 需释放的页地址（必须是页对齐的有效地址）
 */
void free_page(void* page);

/**
 * 分配n个连续的物理页
 * 参数：n - 连续页数量（n > 0）
 * 返回：起始页地址（页对齐，成功）或 NULL（失败）
 */
void* alloc_pages(size_t n);

/**
 * 释放n个连续的物理页
 * 参数：page - 起始页地址（页对齐）；n - 连续页数量（n > 0）
 */
void free_pages(void* page, size_t n);

/**
 * 获取内存使用信息
 * 参数：total - 输出总内存大小（字节）；free - 输出空闲内存大小（字节）
 */
void get_memory_info(size_t* total, size_t* free);

#endif // PMM_H

